home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / graphic / frasr182.zip / PARSERFP.C < prev    next >
C/C++ Source or Header  |  1993-07-13  |  36KB  |  1,202 lines

  1. /* */
  2. /* PARSERFP.C  -- Part of FRACTINT fractal drawer. */
  3. /* */
  4. /*   By Chuck Ebbert  CompuServe [76306,1226] */
  5. /*                     internet: 76306.1226@compuserve.com  */
  6. /* */
  7. /* Fast floating-point parser code.  The functions beginning with */
  8. /*    "fStk" are in PARSERA.ASM.  PARSER.C calls this code after */
  9. /*    it has parsed the formula. */
  10. /* */
  11. /*   Converts the function pointers/load pointers/store pointers */
  12. /*       built by parsestr() into an optimized array of function */
  13. /*       pointer/operand pointer pairs. */
  14. /* */
  15. /* ******************************************************************* */
  16. /*                                                                     */
  17. /*  Copyright (C) 1992, 1993 Chuck Ebbert.  All rights reserved.       */
  18. /*                                                                     */
  19. /*    This code may be freely distributed and used in non-commercial   */
  20. /*    programs provided the author is credited either during program   */
  21. /*    execution or in the documentation, and this copyright notice     */
  22. /*    is left intact.  Sale of this code, or its use in any commercial */
  23. /*    product requires permission from the author.  Nominal            */
  24. /*    distribution and handling fees may be charged by shareware and   */
  25. /*    freeware distributors.                                           */
  26. /*                                                                     */
  27. /*       Chuck Ebbert                                                  */
  28. /*       1915 Blust Ln.                                                */
  29. /*       Enola, PA  17025                                              */
  30. /*                                                                     */
  31. /* ******************************************************************* */
  32. /* */
  33. /* Revised 12 July 1993 (for v18.1) by CAE to fix optimizer bug  */
  34. /* */
  35. /* Revised 22 MAR 1993 (for Fractint v18.0)  */
  36. /* */
  37. /* Uncomment the next line to enable debug. */
  38. /*      #define TESTFP 1  */
  39. /* */
  40.  
  41. #include <string.h>
  42. #include <ctype.h>
  43. #include <stdio.h>
  44. #include <stdlib.h>
  45. #include <float.h>
  46. #include <time.h>
  47. #include "mpmath.h"
  48. #include "prototyp.h"
  49.  
  50. extern union Arg *Arg1, *Arg2;
  51. /* Some of these variables should be renamed for safety */
  52. extern union Arg s[20], far * far *Store, far * far *Load;
  53. extern int StoPtr, LodPtr, OpPtr;
  54. extern int debugflag;
  55. extern unsigned vsp, LastOp;
  56. extern struct ConstArg far *v;
  57. extern int inside;         /* "inside" color to use    */
  58. extern int outside;        /* "outside" color to use   */
  59. extern int potflag;        /* potential enabled? */
  60. extern char useinitorbit;
  61. extern int InitLodPtr, InitStoPtr, InitOpPtr, LastInitOp;
  62. extern void (far * far *f)(void);
  63.  
  64. struct fls { /* function, load, store pointers  CAE fp */
  65.    void (near *function)(void);
  66.    union Arg near *operand;
  67. } far *pfls = (struct fls far *)0;
  68.  
  69. void  StkLod(void);
  70. void  StkClr(void);
  71. void  dStkAdd(void);
  72. void  dStkSub(void);
  73. void  dStkMul(void);
  74. void  dStkDiv(void);
  75. void  StkSto(void);
  76. void  dStkSqr(void);
  77. void  EndInit(void);
  78. void  dStkMod(void);
  79. void  dStkLTE(void);
  80. void  dStkSin(void);
  81. void  dStkCos(void);
  82. void  dStkSinh(void);
  83. void  dStkCosh(void);
  84. void  dStkCosXX(void);
  85. void  dStkTan(void);
  86. void  dStkTanh(void);
  87. void  dStkCoTan(void);
  88. void  dStkCoTanh(void);
  89. void  dStkLog(void);
  90. void  dStkExp(void);
  91. void  dStkPwr(void);
  92. void  dStkLT(void);
  93. void  dStkFlip(void);
  94. void  dStkReal(void);
  95. void  dStkImag(void);
  96. void  dStkConj(void);
  97. void  dStkNeg(void);
  98. void  dStkAbs(void);
  99. void  dStkRecip(void);
  100. void  StkIdent(void);
  101. void  dStkGT(void);
  102. void  dStkGTE(void);
  103. void  dStkNE(void);
  104. void  dStkEQ(void);
  105. void  dStkAND(void);
  106. void  dStkOR(void);
  107.  
  108. #define fgf(x) pfls[(x)].function
  109. #define opp(x) pfls[(x)].operand
  110. #define NO_OPERAND (void near *)0
  111. #define LastSqr v[4].a
  112. #define MAX_ARGS 100
  113. #define MAX_STACK 8
  114. #define TWO_FREE 6
  115.  
  116. #ifndef XFRACT
  117.  
  118. void (near fStkPull2 )(void); /* pull up fpu stack from 2 to 4 */
  119. void (near fStkPush2 )(void); /* push down fpu stack from 8 to 6 */
  120. void (near fStkPush2a )(void); /* push down fpu stack from 6 to 4 */
  121. void (near fStkPush4 )(void); /* push down fpu stack from 8 to 4 */
  122. void (near fStkLodDup )(void); /* lod, dup */
  123. void (near fStkLodSqr )(void); /* lod, sqr, dont save magnitude */
  124. void (near fStkLodSqr2 )(void); /* lod, sqr, save magnitude */
  125. void (near fStkStoDup )(void); /* store, duplicate */
  126. void (near fStkStoSqr )(void); /* store, sqr, save lastsqr */
  127. void (near fStkStoSqr0 )(void); /* store, sqr, dont save lastsqr */
  128. void (near fStkLodDbl )(void); /* load, double */
  129. void (near fStkStoDbl )(void); /* store, double */
  130. void (near fStkReal2 )(void); /* fast ver. of real */
  131. void (near fStkSqr )(void); /* sqr, save magnitude in lastsqr */
  132. void (near fStkSqr0 )(void); /* sqr, no save magnitude */
  133. void (near fStkClr1 )(void); /* clear fpu */
  134. void (near fStkClr2 )(void); /* test stack top, clear fpu */
  135. void (near fStkStoClr1 )(void); /* store, clr1 */
  136. void (near fStkAdd )(void);
  137. void (near fStkSub )(void);
  138. void (near fStkSto )(void);
  139. void (near fStkSto2 )(void); /* fast ver. of sto */
  140. void (near fStkLod )(void);
  141. void (near fStkEndInit )(void);
  142. void (near fStkMod )(void);
  143. void (near fStkMod2 )(void);
  144. void (near fStkLodMod2 )(void);
  145. void (near fStkStoMod2 )(void);
  146. void (near fStkLTE )(void);
  147. void (near fStkLodLTEMul )(void);
  148. void (near fStkLTE2 )(void);
  149. void (near fStkLodLTE )(void);
  150. void (near fStkLodLTE2 )(void);
  151. void (near fStkLodLTEAnd2 )(void);
  152. void (near fStkLT )(void);
  153. void (near fStkLodLTMul )(void);
  154. void (near fStkLT2 )(void);
  155. void (near fStkLodLT )(void);
  156. void (near fStkLodLT2 )(void);
  157. void (near fStkGTE )(void);
  158. void (near fStkLodGTE )(void);
  159. void (near fStkLodGTE2 )(void);
  160. void (near fStkGT )(void);
  161. void (near fStkGT2 )(void);
  162. void (near fStkLodGT )(void);
  163. void (near fStkLodGT2 )(void);
  164. void (near fStkEQ )(void);
  165. void (near fStkLodEQ )(void);
  166. void (near fStkNE )(void);
  167. void (near fStkLodNE )(void);
  168. void (near fStkAND )(void);
  169. void (near fStkANDClr2 )(void);
  170. void (near fStkOR )(void);
  171. void (near fStkSin )(void);
  172. void (near fStkSinh )(void);
  173. void (near fStkCos )(void);
  174. void (near fStkCosXX )(void);
  175. void (near fStkCosh )(void);
  176. void (near fStkTan )(void);
  177. void (near fStkTanh )(void);
  178. void (near fStkCoTan )(void);
  179. void (near fStkCoTanh )(void);
  180. void (near fStkLog )(void);
  181. void (near fStkExp )(void);
  182. void (near fStkPwr )(void);
  183. void (near fStkMul )(void);
  184. void (near fStkDiv )(void);
  185. void (near fStkFlip )(void);
  186. void (near fStkReal )(void);
  187. void (near fStkImag )(void);
  188. void (near fStkRealFlip )(void);
  189. void (near fStkImagFlip )(void);
  190. void (near fStkConj )(void);
  191. void (near fStkNeg )(void);
  192. void (near fStkAbs )(void);
  193. void (near fStkRecip )(void);
  194. void (near fStkLodReal )(void);
  195. void (near fStkLodRealC )(void);
  196. void (near fStkLodImag )(void);
  197. void (near fStkLodRealFlip )(void);
  198. void (near fStkLodRealAbs )(void);
  199. void (near fStkLodRealMul )(void);
  200. void (near fStkLodRealAdd )(void);
  201. void (near fStkLodRealSub )(void);
  202. void (near fStkLodImagFlip )(void);
  203. void (near fStkLodImagAbs )(void);
  204. void (near fStkLodConj )(void);
  205. void (near fStkLodAdd )(void);
  206. void (near fStkLodSub )(void);
  207. void (near fStkLodSubMod )(void);
  208. void (near fStkLodMul )(void);
  209. void (near fStkPLodAdd )(void);
  210. void (near fStkPLodSub )(void);
  211. void (near Img_Setup )(void);
  212.  
  213.  
  214. static void (near *prevfptr )(void);
  215. static int stkcnt, prevstkcnt, cvtptrx, prevlodptr, lastsqrused;
  216.  
  217. static void CvtFptr(void (near * ffptr)(void), int MinStk, int MaxStk,
  218.       int Delta )
  219. /* (MinStk <= 4, MaxStk >= TWO_FREE) */
  220. {
  221.    char testconst = 0;
  222.  
  223.    if (stkcnt < MinStk ) { /* not enough operands on fpu stack */
  224. #ifdef TESTFP
  225.       stopmsg(0, "Inserted pull." );
  226. #endif
  227.       opp(cvtptrx) = NO_OPERAND;
  228.       fgf(cvtptrx++) = fStkPull2;  /* so adjust the stack, pull operand */
  229.       stkcnt += 2;
  230.    }
  231.    else if (stkcnt > MaxStk ) { /* too many operands */
  232. #ifdef TESTFP
  233.       stopmsg(0, "Inserted push." );
  234. #endif
  235.       opp(cvtptrx) = NO_OPERAND;
  236.       fgf(cv